#ifndef ANALEX_H_INCLUDED
#define ANALEX_H_INCLUDED

//PALAVRAS RESERVADAS     TOKEN
#define 	INICIO      	10
#define 	FIM         	11
#define 	TIPO        	12
#define 	VETOR	        13
#define 	INTEIRO     	14
#define 	REAL        	15
#define 	CHAR        	16
#define 	LOGICO      	17
#define 	REGISTRO	    18
#define 	FIMREGISTRO 	19
#define 	FUNCAO      	20
#define 	PROCEDIMENTO	21
#define 	SE           	22
#define 	ENTAO	        23
#define 	SENAO	        24
#define 	FIMSE	        25
#define 	ENQUANTO	    26
#define 	FACA	        27
#define 	FIMENQUANTO	    28
#define 	SELETOR	        29
#define 	CASO	        30
#define 	QUEBRA	        31
#define 	PADRAO      	32
#define 	FIMSELETOR	    33
#define 	LEIA	        34
#define 	IMPRIMA	        35
#define 	VERDADEIRO	    36
#define 	FALSO	        37
#define 	NAO	            38
#define 	E           	39
#define 	OU	            40

//TOKENS
#define 	ID	            41
#define 	NUM	            42
#define 	LITERAL     	43
#define 	PONTO	        44
#define 	VIRGULA	        45
#define 	PONTOEVIRGULA	46
#define 	DOISPONTOS	    47
#define 	IGUAL	        48
#define 	MAIS	        49
#define 	MENOS	        50
#define 	MULTIPLICACAO	51
#define 	DIVISAO	        52
#define 	MENOR	        53
#define 	DIFERENTE	    54
#define 	ATRIBUICAO	    55
#define 	MENOROUIGUAL	56
#define 	MAIOR	        57
#define 	MAIOROUIGUAL	58
#define 	ABREPARENTESES	59
#define 	FECHAPARENTESES	60
#define 	ABRECOLCHETES	61
#define 	FECHACOLCHETES	62
#define 	ASPAS	        63
#define 	ABRECHAVES	    64
#define 	FECHACHAVES	    65

//tokens necessarios para o Analizador Sintatico
#define     FIMCONJUNTO     202

//ESTADOS DO AUTOMATO
#define     Q0              0
#define     Q1              1
#define     Q2              2
#define     Q3              3
#define     Q4              4
#define     Q5              5
#define     Q6              6
#define     Q7              7
#define     Q8              8
#define     Q9              9
#define     Q10             10
#define     Q11             11
#define     Q12             12
#define     Q13             13
#define     Q14             14
#define     Q15             15
#define     Q16             16
#define     Q17             17
#define     Q18             18
#define     Q19             19
#define     Q20             20
#define     Q21             21
#define     Q22             22
#define     Q23             23
#define     Q24             24
#define     Q25             25
#define     Q26             26
#define     Q27             27
#define     Q28             28
#define     Q29             29
#define     Q30             30
#define     Q31             31
#define     Q32             32
#define     Q33             33
#define     Q34             34
#define     Q35             35
#define     Q36             36
#define     Q37             37
#define     Q38             38

//CONSTANTES
#define BUFFER_LEITURA_ARQUIVO    1024
#define TAMANHO_PADRAO_LEXEMA     128

//BIBLIOTECAS UTILIZADAS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#include "erros.h"
#include "tabeladeSimbolos.h"

char proximoCaractere();

void iniciaAnalex(FILE *arquivoACompilar);

void reiniciaAutomato();

int proximoToken();

int retornaContadorLinha();

int retornaContadorColuna();

void instanciaPalavrasReservadas(TabeladeSimbolos* tabelaPalavrasReservadas);

void compoeLexema(char c);

char* retornaLexema();

void destroiAnalex();

void imprimeTabelas();

char* retornaNomeToken(int token);

#endif // ANALEX_H_INCLUDED
